const genericPool = require('generic-pool');
const sqlite3 = require('sqlite3').verbose();

const dbConfig = {}
const poolConfig = {
  max: 10, // 最大连接数
  min: 2, // 最小连接数
  acquireTimeoutMillis: 30000, // 获取连接的超时时间（毫秒）
  create: create, // 创建新连接的工厂函数
  destroy: destroy, // 销毁连接的函数
  validate: validate // 验证连接是否有效的函数
}

// 创建工厂函数，用于生成新的SQLite数据库连接
function create() {
  return new Promise((resolve, reject) => {
    const db = new sqlite3.Database(dbConfig.dbPath || ':memory:', (err) => {
      if (err) {
        reject(err);
      } else {
        resolve(db);
      }
    });
  });
}

// 销毁函数，用于关闭SQLite数据库连接
function destroy(db) {
  return new Promise((resolve, reject) => {
    db.close((err) => {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
  });
}

// 验证函数，可选：验证连接是否有效的函数
function validate(db) {
  return new Promise((resolve, reject) => {
    db.run("SELECT 1", (err) => {
      if (err) {
        reject(false);
      } else {
        resolve(true);
      }
    });
  });
}

function init(conf) {
  // 配置数据库选项
  Object.assign(dbConfig, conf.dbSqlite);
  // 配置连接池选项
  Object.assign(poolConfig, conf.dbPool);
  // 创建连接池
  const pool = genericPool.createPool(poolConfig);
  return pool;
}

function close(pool) {
  // 当不再需要连接池时，可以清空并关闭它
  pool.drain()
    .then(() => pool.clear())
    .catch(console.error);
}

module.exports = { init, close }